#ifndef _BIB_SOCKET_H
#define _BIB_SOCKET_H

#include <stdlib.h>
#include <string.h>
#include <errno.h>

#include <sys/socket.h>
#include <unistd.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/un.h>

#include "bib_Log.h"

#define TAM_DESCRIPTOR_ID 16

#define SERVER_PATH "\comunicacion"

typedef struct HEADER_MPS{
	char	descriptorID[TAM_DESCRIPTOR_ID];
	char	payloadDescriptor;
	int		payloadLength;
} HEADER_MPS;

#define RESPUESTA_FAIL	0
#define RESPUESTA_OK	1

int abrirSocket (int *miSock);	/*socket*/
int cerrarSocket(int miSock);	/*close*/
int enlazarPuerto(int *miSock, int miPuerto); /*bind*/
int escuchar(int miSock, int cantConexColaEspera); /*listen*/
int aceptarConexion(int miSock, int *sockEntrante, struct sockaddr *addrEntrante);	/*accept*/
int conectar(int miSock, int puertoServidor, char *IPServidor);	/*connect*/
int sendall(int s, char *buf, int *len);	/*send*/
int reciveall(int sock, char *buf, int *len);	/*recv*/
int verificarDescriptores(int maximo, fd_set *socketsLectura); /*select*/

int abrirSocketServidor(int *miSock, int miPuerto, int cantConexColaEspera); /*socket + bind + listen*/
int abrirSocketCliente(int *miSock, int puertoServidor, char *IPServidor); /*socket + connect*/

/*int obtenerMiIPyPuerto(int miSock, char *bufIP, char *bufPort);*/

int inicializarSemilla(void); /*Llamar solo una vez al principio del programa*/
int generarDescriptorID(char *descriptorID); /*Antes de llamar a esta funcion se debe llamar a inicializarSemilla()*/
int enviarMensajeMPS(int sock, struct HEADER_MPS *header, char *payload);
int recibirMensajeMPS(int sock, struct HEADER_MPS *header, char *payload);
int recibirMensajeMPSDinamico(int sock, struct HEADER_MPS *header, char **payload);

int abrirSocketUnix(int *miSock, char *ruta, int cantConexColaEspera);

#endif	/*_BIB_SOCKET_H*/